package com.xxxx.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxxx.crm.base.BaseService;
import com.xxxx.crm.dao.SaleChanceMapper;
import com.xxxx.crm.enums.DevResult;
import com.xxxx.crm.enums.StateStatus;
import com.xxxx.crm.query.SaleChanceQuery;
import com.xxxx.crm.utils.AssertUtil;
import com.xxxx.crm.utils.PhoneUtil;
import com.xxxx.crm.vo.SaleChance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:王亚栋
 * @Date:2022/12/19 16:52
 * @Version:1.0
 */
@Service
public class SaleChanceService extends BaseService<SaleChance,Integer> {

    @Autowired
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件分页查询营销机会
     * @param saleChanceQuery
     * @return
     */
    public Map<String,Object> querySaleChanceByParams(SaleChanceQuery saleChanceQuery){

        Map<String,Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(),saleChanceQuery.getLimit());
        //得到分页对象
        PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChanceMapper.selectByParams(saleChanceQuery));

        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        map.put("data",pageInfo.getList());

        return map;
    }

    /**
     * 添加营销机会
     * 参数校验
     *      customerName 非空
     *      linkMan     非空
     *      linkPhone   非空
     * 设置默认参数
     *      createMan   当前登录用户名
     *      assignMan   指派人
     *          如果未设置指派人 --默认
     *          分配状态
     * @param saleChance
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addSaleChance(SaleChance saleChance){

        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());

        //是否有效
        saleChance.setIsValid(1);

        saleChance.setCreateDate(new Date());
        saleChance.setUpdateDate(new Date());

        //是否设置了指派人
        if (StringUtils.isBlank(saleChance.getAssignMan())){
            //如果为空，表示未设置
            saleChance.setState(StateStatus.UNSTATE.getType());
            saleChance.setAssignTime(null);
            saleChance.setDevResult(DevResult.UNDEV.getStatus());

        }else {
            //表明设置了 指派人
            saleChance.setState(StateStatus.STATED.getType());
            //设置指派时间
            saleChance.setAssignTime(new Date());
            //设置开发状态
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }
        //执行添加操作
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance) != 1,"添加营销机会失败！");
    }

    /**
     * 参数校验
     * @param customerName
     * @param linkMan
     * @param linkPhone
     */
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {

        AssertUtil.isTrue(StringUtils.isBlank(customerName),"客户名称不能为空！");
        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空！");
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系号码不能为空！");
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"联系号码格式不正确！");
    }

    /**
     * 更新营销机会
     *  1.参数校验
     *      营销机会ID  非空，数据库中对应存在的记录
     *      customerName    非空
     *      linkMan         非空
     *      linkPhone       非空
     *  2.设置相关默认参数
     *      updateDate      系统当前时间
     *      assignMan   指派人
     *          原始数据未设置
     *              修改后未设置 == 》  不需要操作
     *              修改后设置  == 》   assignTime 设置指派时间
     *          原始数据已经设置
     *              修改后未设置  == 》  assignTime 设置为null
     *                  分配状态 0=未分配 开发状态 0=未开发
     *              修改后也设置
     *                  判断是否是同一个指派人
     *                      是 == 》 不用操作
     *                      不是 == 》 更新assignTime 指派时间
     *  3.执行更新操作
     * @param saleChance
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateSaleChance(SaleChance saleChance){

        //1.参数校验 主键ID
        AssertUtil.isTrue(null == saleChance.getId(),"待更新记录不存在！");
        //通过主键查询
        SaleChance temp = saleChanceMapper.selectByPrimaryKey(saleChance.getId());
        AssertUtil.isTrue(temp == null,"待更新记录不存在！");
        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());

        //设置默认时间
        saleChance.setUpdateDate(new Date());

        //判断修改之前的指派人是否存在
        if (StringUtils.isBlank(temp.getAssignMan())){
            //原始指派人不存在
            if (!StringUtils.isBlank(saleChance.getAssignMan())){
                //指派时间
                saleChance.setAssignTime(new Date());
                // 分配状态 1=已分配
                saleChance.setState(StateStatus.STATED.getType());
                //开发状态 1=开发中
                saleChance.setDevResult(DevResult.DEVING.getStatus());
            }
        }else {
            //原始指派人存在
            if (StringUtils.isBlank(saleChance.getAssignMan())){

                //修改后没有指派人
                //分配时间 null
                saleChance.setAssignTime(null);
                //状态 0=未分配
                saleChance.setState(StateStatus.UNSTATE.getType());
                //开发状态 0=未开发
                saleChance.setDevResult(DevResult.UNDEV.getStatus());
            }else {
                //修改后指派人也存在

                //1.修改前后的指派人是否相同
                if (!temp.getAssignMan().equals(saleChance.getAssignMan())){
                    //更新指派时间
                    saleChance.setAssignTime(new Date());
                }else {
                    //设置指派时间为修改前的时间
                    saleChance.setAssignTime(temp.getAssignTime());
                }

            }
        }
        //3.执行更新操作
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"营销机会更新成功！");

    }

    /**
     * 删除营销机会
     * @param ids
     */
    public void deleteSaleChance(Integer[] ids){

        //判断id是否为空
        AssertUtil.isTrue(null == ids || ids.length < 1,"待删除记录不存在！");
        //执行更新操作
        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) != ids.length,"营销机会数据删除失败！");

    }

    /**
     * 更新营销机会的开发状态
     * @param id
     * @param devResult
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateSaleChanceDevResult(Integer id, Integer devResult) {

        //判断ID是否为空
        AssertUtil.isTrue(null == id,"待更新记录不存在，数据异常！");
        //通过ID查询营销机会数据
        SaleChance saleChance = saleChanceMapper.selectByPrimaryKey(id);
        //判断对象是否为空
        AssertUtil.isTrue(saleChance == null,"待更新记录不存在！");
        //设置开发状态
        saleChance.setDevResult(devResult);

        //执行更新操作
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"开发状态更新失败！");

    }
}
